/*
 * Copyright 2023 devaper
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package io.github.devaper.pigeon.support

import io.github.devaper.pigeon.component.*
import io.github.devaper.pigeon.factory.*
import io.github.devaper.pigeon.handler.argument.*
import io.github.devaper.pigeon.handler.method.*
import io.github.devaper.pigeon.intercept.*
import io.github.devaper.pigeon.request.*
import io.github.devaper.pigeon.response.*
import io.github.devaper.pigeon.support.component.*

/**
 * 基于CountDownLatch的MethodHandler
 *
 * @param requestBasicInfo
 */
class CountDownLatchHttpMethodHandler(
    requestBasicInfo: RequestBasicInfo,
    httpClientEngine: HttpClientEngine,
    httpMessageConverter: HttpMessageConverter,
    requestInterceptor: RequestInterceptor,
    methodContext: io.github.devaper.pigeon.MethodContext,
    argumentHandler: ArgumentHandler,
    fallbackInstance: Any?,
    retryConfig: RetryConfig?
) : AbstractHttpMethodHandler(
    requestBasicInfo= requestBasicInfo,
    httpClientEngine = httpClientEngine,
    httpMessageConverter = httpMessageConverter,
    requestInterceptor = requestInterceptor,
    methodContext = methodContext,
    argumentHandler = argumentHandler,
    fallbackInstance = fallbackInstance,
    retryConfig = retryConfig
) {
    override fun createDeferred(requestTemplate: RequestTemplate, args: Array<out Any?>): Deferred<Any> {
        val deferred = CountDownLatchDeferred<Any>(
            methodHandler = this,
            arguments = args
        )
        val callback = CountDownLatchHttpClientCallback(methodHandler = this)

        deferred.requestTemplate = requestTemplate
        deferred.callback = callback

        callback.deferred = deferred

        httpClientEngine.execute(requestTemplate, callback)
        return deferred
    }

}